
#include<iostream>
#include<string>
#include<ctime>  //clock
#include"local_string.h"
#define STD mystd   //改为std可以运行标准库版本

//测试可知，结果与标准库的运行结果一样

using std::cout;
using std::wcout;
using std::cin;
using std::wcin;
using std::endl;

int main()
{  // 以下是一些测试代码！
    STD::string str;
    str = "ABCDEFGHIJK";  //11 个字符长度

    clock_t start = clock();

    //之所以选择在首部进行插入操作，是为了测试在极端条件下的运行效率！
    for(int i = 0; i < 25; ++i)
        str.insert(0,str);
    //完成循环后，str会变得很大,大小为 11乘以2的25次方 ，结果为369,098,752个字符长度
    clock_t finish = clock();
/*
 在release版本下的统计结果如下：（运行时间/S)
 mystd        |       std
--------------|--------------------
 0.348        |       0.435
 0.366        |       0.446
 0.359        |       0.47
 0.392        |       0.46
 0.374        |       0.445
 可以看到，我的实现版本比标准库略快！
声明：我的机器是win8系统,vs2012
*/
    cout<<double(finish - start) / CLOCKS_PER_SEC << "秒"<<endl;
    //str.size()的结果与标准库一样，str.capacity()不一样，
    //这个是正常的，capacity()的结果与具体的实现有关
    cout<<str.size()<<"\t"<<str.capacity()<<endl;
    str.swap(STD::string()); //显式释放内存

    //我的邮箱,希望不吝赐教！
    str.insert(0,"sunkang2101024@foxmail.com");

    //正确的输出结果是sunkang2101024
    cout<<str.erase(str.find_first_of('@',0))<<endl;


    //宽字符版本测试
    wcout<<STD::wstring(L"hello world").c_str()<<endl;
    STD::wstring wstr;
    wstr += L"ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    //测试反向迭代器
    for(STD::wstring::const_reverse_iterator first = wstr.rbegin(); first != wstr.rend(); ++first)
        wcout<<*first<<"\t";
    cout<<endl;

    //间接测试compare函数
    if(STD::string("hello world") == "hello world")
        cout<<"相等"<<endl;
    else
        cout<<"不相等"<<endl;

    //测试一下replace函数
    cout<<str.assign("hello world").replace(6,5,str)<<endl;
    cout<<str.replace(str.begin(),str.end(),"sunkang2101024@foxmail.com")<<endl;

    //测试重载的operator +
    cout<<"HHHHHHH " + str + 'A' + "ABCDEFG"<<endl;

    // 测试异常
    try
    {
        str.clear();
        cout<<str.at(100)<<endl;
        //此时会抛出异常
    }
    catch(std::out_of_range& ex)
    {
        cout<<ex.what()<<endl;
    }

    // 测试rfind函数
    str = "ABCDEFG   RSTUVQXYZ";
    STD::string::size_type pos = str.rfind("EFG",str.size(),2);
    //可以试着将函数的第三个参数取一个比较大的值，比如100，
    //在我的这个实现版本下，仍然会取得正确的结果，vs2012测试不行
    if(pos != STD::string::npos)
        cout<<str.substr(pos)<<endl;

    cout<<endl;
    system("pause");
    return 0;
}
